package com.itlong.cloud.property.dao;

import com.itlong.cloud.POJO.DTO.property.*;
import com.itlong.cloud.POJO.PO.AppUserRoomPO;
import com.itlong.cloud.POJO.VO.app.AppRoomOwnerInfoVO;
import com.itlong.cloud.POJO.VO.property.AppUserInfoGetVO;
import com.itlong.cloud.POJO.VO.property.CheckHouseHoldByRoomVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *       物业系统用户与房间信息接口
 * </desc>
 *
 * @createDate 2017/09/21
 */
@Mapper
@Repository
public interface IPropertyAppUserRoomDao extends IAbstractBaseDao<AppUserRoomPO> {
    /**
     * <desc>
     *      保存用户与房间关系信息
     * </desc>
     * @param params
     * @return
     * @author zhangs
     * @createDate 2017/09/21
     */
    Integer save(Map<String, Object> params);

    /**
     * <desc>
     *      根据用户房间信息实体对象更新用户迁入迁出状态
     * </desc>
     * @param appUserRoomPO App用户信息实体对象
     * @return Integer 影响的数据数量
     * @author zhangs
     * @createDate 2017/09/26
     */
    Integer updateUserRoomStatus(AppUserRoomPO appUserRoomPO);

    /**
     * <desc>
     *      依据用户所在房屋的roomId更新用户房间信息
     * </desc>
     * @param params
     * @return Integer 影响的数据数量
     * @author zhangs
     * @createDate 2017/09/26
     */
    Integer updateUserByRoomId(Map<String, Object> params);

    /**
     * <desc>
     *      清空指定房间和状态下的开门密码
     * </desc>
     * @param params
     * @return Integer 影响的数据数量
     * @author zhangs
     * @createDate 2017/12/7
     */
    Integer emptyOperPwdByRoom(Map<String, Object> params);

    /**
     * <desc>
     *      根据id删除用户房间信息
     * </desc>
     * @param userIds App用户Id的List
     * @return Integer 影响的数据数量
     * @author zhangs
     * @createDate 2017/09/21
     */
    Integer usersRemove(List<String> userIds);

    /**
     * <desc>
     *      根据用户房间信息实体对象删除用户房间信息
     * </desc>
     * @param appUserRoomPO App用户房间信息的实体对象
     * @return Integer 影响的数据数量
     * @author zhangs
     * @createDate 2017/09/21
     */
    void deleteByPO(AppUserRoomPO appUserRoomPO);

    /**
     * <desc>
     *      根据App用户相关房间信息数据传输对象获取用户相关房间信息
     * </desc>
     * @param checkAppUserDTO 条件查询App用户房间信息数据传输对象
     * @return List<AppUserRoomDetailsDTO> App用户相关房间信息数据传输对象的List
     * @author zhangs
     * @createDate 2017/09/21
     */
    List<AppUserRoomDetailsDTO> getUserRoomList(CheckAppUserDTO checkAppUserDTO);

    /**
     * <desc>
     *      根据用户相关房间信息实体对象获取用户房间信息List
     * </desc>
     * @param appUserRoomPO App用户房间信息实体对象
     * @return List<AppUserRoomPO> App用户相关房间信息的List
     * @author zhangs
     * @createDate 2017/09/21
     */
    List<AppUserRoomPO> getCompareListByPO(AppUserRoomPO appUserRoomPO);

    /**
     * <desc>
     *      获取审核未通过用户房间信息分页数据集
     * </desc>
     * @param params
     * @return List<AppUserInfoGetVO> 用户房间信息数据传输对象集
     * @author zhangs
     * @createDate 2017/09/29
     */
    List<AppUserInfoGetVO> getUserRoomByPageList(Map<String, Object> params);

    /**
     * <desc>
     *      获取审核未通过用户房间信息分页总数量
     * </desc>
     * @param params
     * @return Integer 分页总数量
     * @author zhangs
     * @createDate 2017/09/29
     */
    Integer getPageCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取已迁入(包含一卡通添加)过App用户相关房间信息分页列表
     * </desc>
     * @param params
     * @return List<AppUserInfoGetVO> 用户房间信息数据传输对象集
     * @author zhangs
     * @createDate 2017/09/29
     */
    List<AppUserInfoGetVO> getMoveInUserRoomByPageLst(Map<String, Object> params);

    /**
     * <desc>
     *      住户权限分配获取已迁入(包含一卡通添加)过App用户相关房间信息分页列表
     * </desc>
     * @param params
     * @return List<AppUserInfoGetVO> 用户房间信息数据传输对象集
     * @author QiangS
     * @createDate 2020/02/21
     */
    List<AppUserInfoGetVO> getMoveInUserRoomByPageLstForHouseHold(Map<String, Object> params);

    /**
     * <desc>
     *      获取已迁入(包含一卡通添加)过App用户相关房间信息分页总数
     * </desc>
     * @param params
     * @return Integer 分页总数量
     * @author zhangs
     * @createDate 2017/09/29
     */
    Integer getMoveInUserRoomPageCount(Map<String, Object> params);

    /**
     * <desc>
     *      住户权限分配获取已迁入(包含一卡通添加)过App用户相关房间信息分页总数
     * </desc>
     * @param params
     * @return Integer 分页总数量
     * @author QiangS
     * @createDate 2020/02/21
     */
    Integer getMoveInUserRoomPageCountForHouseHold(Map<String, Object> params);

    /**
     * <desc>
     *      获取迁出用户房间信息分页数据集
     * </desc>
     * @param params
     * @return List<AppUserInfoGetVO> 用户房间信息数据传输对象集
     * @author zhangs
     * @createDate 2017/09/29
     */
    List<AppUserInfoGetVO> getRemoveUserRoomByPageList(Map<String, Object> params);

    /**
     * <desc>
     *      获取迁出用户房间信息分页总数量
     * </desc>
     * @param params
     * @return Integer 分页总数量
     * @author zhangs
     * @createDate 2017/09/29
     */
    Integer getRemovePageCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取待审核用户房间信息分页数据集
     * </desc>
     * @param params
     * @return List<AppUserInfoGetVO> 用户房间信息数据传输对象集
     * @author zhangs
     * @createDate 2017/09/29
     */
    List<AppUserInfoGetVO> getNotAuditUserRoomByPageList(Map<String, Object> params);

    /**
     * <desc>
     *      获取待审核用户房间信息分页总数量(兼容旧App，住户添加小区无住户房间信息时为待审核状态)
     * </desc>
     * @param params
     * @return Integer 分页总数量
     * @author zhangs
     * @createDate 2017/09/29
     */
    Integer getNotAuditPageCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取一卡通用户房间信息分页数据集
     * </desc>
     * @param params
     * @return List<AppUserInfoGetVO> 用户房间信息数据传输对象集
     * @author zhangs
     * @createDate 2017/12/08
     */
    List<AppUserInfoGetVO> getCheckSmartCardUserList(Map<String, Object> params);

    /**
     * <desc>
     *      获取一卡通用户房间信息分页总数量
     * </desc>
     * @param params
     * @return Integer 分页总数量
     * @author zhangs
     * @createDate 2017/12/08
     */
    Integer getCheckSmartCardUserCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取住户再项目中非迁出状态的住户房间信息
     * </desc>
     * @param params
     * @return List<AppUserRoomPO> 住户房间信息集
     * @author zhangs
     * @createDate 2017/12/08
     */
    List<AppUserRoomPO> getUserRoomByNotRemove(Map<String, Object> params);

    /**
     * <desc>
     *      获取正常状态下的业主身份房间信息
     * </desc>
     * @param params 条件(map("userIds",userIds);map("projectId",projectId))
     * @return
     * @author zhangs
     * @createDate 2018/01/09
     */
    List<AppUserRoomPO> getHouseHoldRoomAtNormalStatus(Map<String,Object> params);

    /**
     * <desc>
     *      更新用户房间信息
     * </desc>
     * @param appUserRoomPO App用户房间信息实体类
     * @return Integer
     * @author zhangs
     * @createDate 2018/2/1
     */
    Integer update(AppUserRoomPO appUserRoomPO);


    /**
     * <desc>
     *     APP端_首页版块根据房间ID获取房间业主的电话号码
     * </desc>
     *
     * @return  房间里业主的电话号码
     */
    String getOwnerPhoneNoInRoom(Map<String,Object> params);


    /**
     * <desc>
     *     根据房间编号获取房间类型
     * </desc>
     *
     * @return  房间类型
     */
    String getRoomTypeByroomId(String roomId);

    /**
     * <desc>
     *      删除用户房间关系(住户信息-未通过-删除/删除业主房间时删除对应二级授权人住户房间关系)
     * <desc/>
     *
     * @param params
     * @return Integer 被影响数据数量
     * @author zhangs
     * @createDate 2017/09/30
     */
    Integer delUserRoom(Map<String, Object> params);

    /**
     * <desc>
     *     APP端_首页版块提交申请验证房屋,查询业主信息
     * </desc>
     * @param params
     * @return  房屋业主的用户ID
     * @author cuiduanwu
     * @createDate 2017-12-10
     */
    AppRoomOwnerInfoVO checkRoomOwner(Map<String,Object> params);

    /**
     * <desc>
     *     APP端_首页版块提交申请验证房屋业主信息是否已存在
     * </desc>
     * @param params
     * @return  房屋业主的记录数
     * @author cuiduanwu
     * @createDate 2017-12-10
     */
    Integer countRoomOwner(Map<String,Object> params);

    /**
     * <desc>
     *     APP端_首页版块提交申请验证,统计房间有效的总人数
     * </desc>
     * @param params
     * @return
     * @author cuiduanwu
     * @createDate 2017-12-14
     */
    Integer countRoomUser(Map<String,Object> params);

    /**
     * <desc>
     *     APP端_首页版块提交申请验证，申请人与房间关系是否已存在
     * </desc>
     * @param appUserRoomPO
     * @return
     * @author cuiduanwu
     * @createDate 2017/12/10
     */
    AppUserRoomPO getPreUserRoom(AppUserRoomPO appUserRoomPO);

    /**
     * <desc>
     *     APP端_首页版块提交申请验证,更新人与房间记录为正常待审核
     * </desc>
     * @param id
     * @param houserType
     * @return
     * @author cuiduanwu
     * @createDate 2017/12/10
     */
    Integer updatePreUserRoom(@Param("id")Integer id,@Param("houserType")Integer houserType, @Param("userRoomStatus") Integer userRoomStatus);

    /**
     * <desc>
     *    批量保存用户房间信息.
     * </desc>
     *
     * @param params 待保存的用户房间信息列表
     * @return 受影响的行数
     * @author zhangs
     * @createDate 2017-09-30
     */
    Integer batchSave(List<Map<String,Object>> params);

    /**
     * <desc>
     *    获取权限变更了的用户的权限地址
     * </desc>
     *
     * @param list 用户Id、项目Id和用户房间状态集合
     * @return 用户的权限地址
     * @author zhangs
     * @createDate 2017/10/13
     */
    List<UserAuthRoomAddrDTO> getUserAuthAddr(List<Map<String, Object>> list);

    /**
     * <desc>
     *    设备服务地址变更,获取用户权限地址
     * </desc>
     *
     * @param params 用户Id、项目Id和用户房间状态集合
     * @return 用户的权限地址
     * @author zhangs
     * @createDate 2017/10/13
     */
    List<UserAuthRoomAddrDTO> getUserAuthAddress(Map<String, Object> params);

    /**
     * <desc>
     *    通过App用户房间实体对象获取App用户房间信息
     * </desc>
     *
     * @param appUserRoomPO 用户房间实体对象
     * @return List<AppUserRoomPO> 用户房间信息
     * @author zhangs
     * @createDate 2017/10/13
     */
    List<AppUserRoomPO> getUserRoomByPO(AppUserRoomPO appUserRoomPO);

    /**
     * <desc>
     *      查询房间下的业主房间信息
     * <desc/>
     *
     * @param params
     * @return List<AppUserRoomPO>
     * @author zhangs
     * @createDate 2017/10/10
     */
    List<AppUserRoomPO> getExistHouserByRoom(Map<String, Object> params);

    /**
     * <desc>
     *      获取与用户绑定的地址
     * <desc/>
     *
     * @param params
     * @return List<AppUserGetContractRoomDTO> 用户房间信息集
     * @author zhangs
     * @createDate 2017/10/20
     */
    List<AppUserGetContractRoomDTO> getRoomContactHouser(Map<String, Object> params);

    /**
     * <desc>
     *      根据楼栋列表或单元列表查询用户列表(由于地址变更影响的用户)
     * <desc/>
     *
     * @param param
     * @return List<AppUserRoomPO> 住户房间信息数据集
     * @author zhangs
     * @createDate 2017/10/20
     */
    List<AppUserRoomPO> getUsersByAddr(Map<String, Object> param);

    /**
     * <desc>
     *      获取与用户绑定的楼栋或单元下房间地址数量
     * <desc/>
     *
     * @param param 查询条件
     * @return List<AppUserRoomPO> 住户房间信息数据集
     * @author zhangs
     * @createDate 2017/11/10
     */
    List<AppUserRoomPO> getRoomCountContactHouse(Map<String, Object> param);


    /**
     * <desc>
     *      根据房间id查询住户列表
     * <desc/>
     *
     * @param roomId 房间id
     * @return Key值(userId,userName,qqNum,sipAccount,isAllowApp,isOnline,projectId)
     * @author Chunjian.G
     * @createDate 2017-11-16
     */
    List<Map<String, Object>> getUsersByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      房屋管理-房屋详情-入住迁出记录
     * <desc/>
     *
     * @param params 查询条件
     * @return List<CheckHouseHoldByRoomVO> 房屋详情中查询入住迁出记录数据信息
     * @author zhangs
     * @createDate 2017/11/23
     */
    List<CheckHouseHoldByRoomVO> getMoveInAndOutRecord(Map<String, Object> params);

    /**
     * <desc>
     *      获取住户所在楼栋Id并以逗号拼接
     * <desc/>
     *
     * @param param 查询条件
     * @return 住户所在楼栋Id并以逗号拼接
     * @author zhangs
     * @createDate 2017/11/23
     */
    String getBuildIdsByHouseHold(Map<String, Object> param);

    /**
     * <desc>
     *      获取用户的楼栋
     * </desc>
     *
     * @param userId
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/06/30
     */
    List<Map<String,Object>> getUserBuilds(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      判断该用户是否是注册过人脸用户
     * <desc/>
     *
     * @param userId 用户ID
     * @param projectId 项目编号
     * @author Juguang.S
     * @createDate 2019/03/20
     */
    Integer isFaceUser(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      查询app授权的用户编号
     * <desc/>
     *
     * @param userId 用户ID
     * @param projectId 项目编号
     * @author Qiang.S
     * @createDate 2019/08/09
     */
    List<String> getAuthUserId(@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取房间的房间号
     * </desc>
     *
     * @param roomId 房间id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/20
     */
    String getRoomNum(@Param("roomId") String roomId);

    /**
     * <desc>
     *      批量修改用户房间状态
     * </desc>
     *
     * @param userRoomPOS
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/28
     */
    Integer batchUpdate(@Param("list") List<AppUserRoomPO> userRoomPOS);

    /**
     * <desc>
     *      根据用户相关房间信息实体对象获取用户房间信息List
     * </desc>
     * @param appUserRoomPO App用户房间信息实体对象
     * @return List<AppUserRoomPO> App用户相关房间信息的List
     * @author zhangs
     * @createDate 2017/09/21
     */
    List<AppUserRoomPO> getAllCompareListByPO(AppUserRoomPO appUserRoomPO);

    /**
     * <desc>
     *      获取楼栋、单元及房间相关ID
     * <desc/>
     *
     * @param  roomDTO 项目Id
     * @return 楼栋、单元及房间相关ID
     * @Author Juguang.S
     * @createDate 2021/06/15
     */
    AppUserRoomDTO getRoomInfo(AppUserRoomDTO roomDTO);

}
